package manager.modulo.ordemservico.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.MensagemExcessao;
import manager.interfaces.InterfaceDao;
import manager.principal.fonte.JanelaLogin;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class UnidadeAtendimentoDao implements InterfaceDao {

    private int id;
    private String identificador;
    private int idEndereco;
    private int idParceiro;

    /**
     * Inicializando as variáveis
     */
    public UnidadeAtendimentoDao() {
        id = 0;
        identificador = "";
        idEndereco = 0;
        idParceiro = 0;
    }

    public static LinkedList<String> buscaListaUnidadePorUsuario(int idUsuario) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        String sql = "";
        sql = "SELECT"
                + "  DISTINCT ua.tx_identificador AS Identificador"
                + " FROM"
                + "  unidade_atendimento ua"
                + "  INNER JOIN parceiro p ON p.id = ua.id_parceiro"
                + "  INNER JOIN usuario_parceiro up ON up.id_parceiro = p.id"
                + "  INNER JOIN usuario u ON u.id = up.id_usuario"
                + " WHERE"
                + "  u.id = ?";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setInt(1, idUsuario);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            result.add(resultSet.getString(1));
        }
        return result;
    }

    /**
     * Buscar o id de uma unidade de atendimento pelo identidificador
     *
     * @param identificador
     * @return Retorno o id da unidade encontrada, caso contrário retorna 0
     * quando não o encontra
     */
    public static int buscarIdUnidadeAtendimentoPorIdentificador(String identificador) {
        try {

            String sql = "SELECT id FROM unidade_atendimento WHERE tx_identificador = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, identificador);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idPartner = 0;
            if (resultSet.first()) {
                idPartner = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idPartner;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Unidades de Atendimento");
            return 0;
        }
    }

    public LinkedList<String> buscar(String opcao, String buscado, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!buscado.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Identificador da Unid. Atend.")) {
                sql = "SELECT tx_identificador FROM unidade_atendimento WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                buscado += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, buscado);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList buscaTabela(String opcao, String buscado) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet");
    }

    /**
     * Carregar as informações do objeto Unidade de Atendimento a partir de um
     * id
     *
     * @param id Id da os buscada
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM unidade_atendimento WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                identificador = resultSet.getString("tx_identificador");
                idParceiro = resultSet.getInt("id_parceiro");
                idEndereco = resultSet.getInt("id_endereco");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Unidades de Atendimento");
        }
    }

    /**
     * Insere um Ponto de Atendimento no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO unidade_atendimento (tx_identificador,id_parceiro,id_endereco) VALUES (?,?,?)";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, identificador);
        preparedStatement.setInt(2, idParceiro);
        preparedStatement.setInt(3, idEndereco);
        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza uma Unidade de Atendimento no banco
     */
    public void atualizar() throws SQLException {
        String sql = "UPDATE unidade_atendimento SET  tx_identificador = ? , id_parceiro = ?, id_endereco = ? WHERE id = ?";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, identificador);
        preparedStatement.setInt(2, idParceiro);
        preparedStatement.setInt(3, idEndereco);
        preparedStatement.setInt(4, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getIdEndereco() {
        return idEndereco;
    }

    public void setIdEndereco(int idEndereco) {
        this.idEndereco = idEndereco;
    }

    public int getIdParceiro() {
        return idParceiro;
    }

    public void setIdParceiro(int idParceiro) {
        this.idParceiro = idParceiro;
    }

    public String getIdentificador() {
        return identificador;
    }

    public void setIdentificador(String identificador) {
        this.identificador = identificador;
    }
}
